home *** CD-ROM | disk | FTP | other *** search
Text File | 1990-08-31 | 3.9 KB | 104 lines | [TEXT/CCL ] |
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;; Copyright 1987, 1988, 1989, 1990 by Ruben Kleiman for Apple Computer, Inc.
- ;;; Advanced Technology Group
- ;;;
-
- ;; driver.lisp
- ;;
- ;;
- ;; A version of Allegro's old serial-streams.lisp
- ;;
-
-
- (in-package :network :use '(ccl system lisp))
-
- (eval-when (eval load compile)
- (require 'traps))
-
- ;Some Macintosh system constants {for referencing into parameter blocks}
- (defconstant $IOREFNUM 24)
- (defconstant $IOPERMSSN 27)
- (defconstant $IOFILENAME 18)
- (defconstant $IOBUFFER 32)
- (defconstant $IOREQCOUNT 36)
- (defconstant $CSCODE 26)
- (defconstant $CSPARAM 28)
-
- (proclaim '(object-variable driver-open driver-pb driver-open-p
- driver-unread-char driver-name))
-
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
- ;;the driver object
- ;;
- ;;drivers inherit from streams (because they are used for io).
- ;;
-
- (defobject *driver* *stream*)
-
- (defobfun (exist *driver*) (init-list)
- (usual-exist init-list)
- (have 'driver-name (getf init-list :driver-name "Unspecified Driver"))
- (have 'driver-open-p nil)
- (have 'driver-pb
- (_NewPtr :errchk ;should this be errchk? {}
- :d0 (getf init-list :pb-size 80)
- :a0))
- (have 'driver-unread-char nil)
- (%put-word driver-pb 0 $ioRefNum) ;address, value, offset
- (%put-byte driver-pb 0 $ioPermssn) ;address, value, offset
- nil)
-
- (defobfun (driver-dispose *driver*) ()
- (if driver-open-p (stream-close)) ;maybe be a continuable error? {}
- (_DisposPtr :errchk :a0 driver-pb))
-
- (defobfun (stream-open *driver*) ()
- (unless driver-open-p
- (stream-close) ;close stream just in case? {}
- (with-pstrs ((np driver-name)) ;get name string in mac format
- (%put-ptr driver-pb np $ioFileName) ;address, value, offset
- (_Open :errchk :a0 driver-pb :d0)) ;open the driver
- (setq driver-open-p t))) ;set open-p to t
-
- (defobfun (stream-close *driver*) ()
- (when driver-open-p ;don't close if its already closed
- (_Close :errchk :a0 driver-pb :d0) ;close the driver
- (setq driver-open-p nil))) ;set open-p to nil
-
- (defobfun (stream-tyo *driver*) (char) ;function for writing to stream
- (%stack-block ((cp 1)) ;make room on stack for character
- (%put-byte cp char) ;put character there
- (%put-ptr driver-pb cp $ioBuffer) ;set up the parameter block
- (%put-long driver-pb 1 $ioReqCount) ;
- (_Write :errchk :a0 driver-pb :d0))) ;write the character
-
- (defobfun (stream-tyi *driver*) () ;function for reading from stream
- (when (not driver-open-p) ;error if driver not open
- (error "Driver: ~s is not open" (self)))
- (if driver-unread-char ;if a character has been 'unread'
- (prog1 driver-unread-char ; return it, and set unread-char
- (setq driver-unread-char nil)) ; to nil
- (%stack-block ((cp 2)) ;otherwise read in a character
- (%put-ptr driver-pb cp $ioBuffer)
- (%put-long driver-pb 1 $ioReqCount)
- (_Read :errchk :a0 driver-pb :d0)
- (%get-byte cp))))
-
- (defobfun (stream-untyi *driver*) (char) ;function 'unreads' a character
- (setq driver-unread-char char))
-
- (defobfun (driver-control *driver*) (code) ;{} find out what this does
- (if (not driver-open-p) (error "Driver: ~s is not open" (self)))
- (%put-word driver-pb code $csCode)
- (_Control :errchk :a0 driver-pb))
-
- (defobfun (driver-status *driver*) (code) ;{} find out what this does
- (if (not driver-open-p) (error "Driver: ~s is not open" (self)))
- (%put-word driver-pb code $csCode)
- (_Status :errchk :a0 driver-pb))
-
- (pushnew :DRIVER *features*)
- (provide :driver)